// 网络请求封装
const BASE_URL = 'http://localhost:8080/api/v1' // 后端API基础URL，请根据实际情况修改

// 请求拦截器
const requestInterceptor = (config: any) => {
  // 可以在这里添加请求头等信息
  const token = uni.getStorageSync('token')
  if (token) {
    config.header = config.header || {}
    config.header['Authorization'] = 'Bearer ' + token
  }
  return config
}

// 响应拦截器
const responseInterceptor = (response: any) => {
  // 可以在这里统一处理响应
  return response
}

// 通用请求方法
const request = (options: any) => {
  // 请求拦截
  options = requestInterceptor(options)
  
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      header: options.header || {},
      success: (res: any) => {
        // 响应拦截
        res = responseInterceptor(res)
        
        // 根据状态码处理
        switch (res.statusCode) {
          case 200:
          case 201:
            // 检查业务状态码
            if (res.data && res.data.code !== undefined) {
              if (res.data.code === 0) {
                // 业务成功
                resolve(res.data)
              } else {
                // 业务失败
                uni.showToast({
                  title: res.data.message || '请求失败',
                  icon: 'none'
                })
                reject(new Error(res.data.message || '请求失败'))
              }
            } else {
              // 没有业务状态码，直接返回数据
              resolve(res.data)
            }
            break
          case 401:
            // 未授权，跳转到登录页
            uni.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            })
            uni.removeStorageSync('token')
            uni.removeStorageSync('user')
            setTimeout(() => {
              uni.redirectTo({
                url: '/pages/auth/login'
              })
            }, 1500)
            reject(res)
            break
          case 403:
            uni.showToast({
              title: '没有权限访问',
              icon: 'none'
            })
            reject(res)
            break
          case 404:
            uni.showToast({
              title: '请求资源不存在',
              icon: 'none'
            })
            reject(res)
            break
          case 500:
            uni.showToast({
              title: '服务器内部错误',
              icon: 'none'
            })
            reject(res)
            break
          default:
            uni.showToast({
              title: '请求失败',
              icon: 'none'
            })
            reject(res)
        }
      },
      fail: (err: any) => {
        uni.showToast({
          title: '网络请求失败',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

// GET 请求
const get = (url: string, data = {}) => {
  return request({
    url,
    method: 'GET',
    data
  })
}

// POST 请求
const post = (url: string, data = {}) => {
  return request({
    url,
    method: 'POST',
    data
  })
}

// PUT 请求
const put = (url: string, data = {}) => {
  return request({
    url,
    method: 'PUT',
    data
  })
}

// DELETE 请求
const del = (url: string, data = {}) => {
  return request({
    url,
    method: 'DELETE',
    data
  })
}

export default {
  request,
  get,
  post,
  put,
  delete: del
}